package com.lhn.springbootinit.config;

import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
import me.chanjar.weixin.mp.config.impl.WxMpDefaultConfigImpl;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

/**
 * 微信开放平台配置
 *
 */
@Slf4j
@Configuration
@ConfigurationProperties(prefix = "wx.open")
@Data
public class WxOpenConfig {

    private String appId;

    private String appSecret;

    private WxMpService wxMpService;

    /**
     * 单例模式（不用 @Bean 是为了防止和公众号的 service 冲突）
     *
     * @return
     */
    public WxMpService getWxMpService() {
        // 如果wxMpService已经初始化，则直接返回
        if (wxMpService != null) {
            return wxMpService;
        }
        // 使用synchronized关键字进行同步，确保只有一个线程能够进入同步块
        synchronized (this) {
            // 再次检查wxMpService是否已经初始化，避免重复初始化
            if (wxMpService != null) {
                return wxMpService;
            }
            // 创建WxMpDefaultConfigImpl对象，用于配置微信公众号的相关信息
            WxMpDefaultConfigImpl config = new WxMpDefaultConfigImpl();
            // 设置公众号的AppID
            config.setAppId(appId);
            // 设置公众号的AppSecret
            config.setSecret(appSecret);
            // 创建WxMpServiceImpl对象，用于调用微信公众号API
            WxMpService service = new WxMpServiceImpl();
            // 将配置信息设置给WxMpServiceImpl对象
            service.setWxMpConfigStorage(config);
            // 将WxMpServiceImpl对象赋值给wxMpService，完成初始化
            wxMpService = service;
            // 返回初始化后的wxMpService对象
            return wxMpService;
        }
    }

}